﻿using Framework.Core.Helper;
using Mapster;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Dynamic.Core;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Modularity;
using Volo.Abp.ObjectMapping;

namespace Framework.Mapster
{
	/// <summary>
	/// 集成 对象映射基础设施 模块
	/// </summary>
	[DependsOn(
		typeof(AbpObjectMappingModule)  // 集成 用于对象映射 模块
		)]
	public class FrameworkMapsterModule : AbpModule
	{
		public override void ConfigureServices(ServiceConfigurationContext context)
		{
			context.Services.AddTransient<IAutoObjectMappingProvider, MapsterAutoObjectMappingProvider>();  // 注入 对象映射实现类

			// 获取Mapster全局映射配置
			var config = TypeAdapterConfig.GlobalSettings;

			Assembly[] assemblies = AssemblyHelper.GetAllLoadAssembly();    // 获取程序集，排除微软内部相关

			// 扫描所有继承 IRegister 接口的对象映射配置
			if (assemblies != null && assemblies.Length > 0) config.Scan(assemblies);

			// 配置Mapster默认全局映射（支持覆盖）
			config.Default
				  .NameMatchingStrategy(NameMatchingStrategy.Flexible)
				  .PreserveReference(true);

			// 配置Mapster默认全局映射（忽略大小写敏感）
			config.Default
				  .NameMatchingStrategy(NameMatchingStrategy.IgnoreCase)
				  .PreserveReference(true);

			// 配置支持依赖注入
			context.Services.AddSingleton(config);
		}
	}
}
